package Rete;

import java.net.*;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import Grafica.*;

public class Client extends Thread{
    String nomeGiocatore;
    DatagramSocket socket;
    String ipServer;
    int portaServer;
    ArrayList<String> giocatoriSulServer;
    Menu guiMenu;

    public Client(int portaServer)
    {
        this.portaServer = portaServer;
        //creo socket per comunicare col server.
        try
        {
            socket = new DatagramSocket();
            socket.setReuseAddress(true);
        }
        catch (SocketException ex) {Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);}
    }

    public void inizializza()
    {
        System.out.println("inizializzo il client");
        setGuiMenu(null);
        setNomeGiocatore(null);
        setIpServer(null);
    }

    public void setGuiMenu(Menu guiMenu)
    {
        this.guiMenu = guiMenu;
    }

    public DatagramSocket getSocket()
    {
        return socket;
    }
 
    public void setNomeGiocatore(String nomeGiocatore)
    {
        this.nomeGiocatore = nomeGiocatore;
    }

    public void setIpServer(String ipServer)
    {
        this.ipServer = ipServer;
    }

    public boolean uniscitiAllaPartitaSulServer()     //CLIENT
    {
      //  System.out.println("CLIENT: uniscitiAllaPartitaSulServer");
        //invio al server il mio nome e ricevo un messaggio che mi dice se mi ha aggiunto o no

        boolean accettato = false;
        System.out.println("--- DA CLIENT A SERVER ---");
        Utils.inviaStringaSuSocket("Chiedo di entrare: "+nomeGiocatore,socket, ipServer, portaServer);
        String risposta = Utils.riceviStringaDaSocket(socket);
        if (risposta.equals("Siamo gia' in 4") || risposta.equals("Nome gia' presente in lista"))
        {
          //  System.out.println("SERVER: "+risposta);
            giocatoriSulServer.add(risposta); //visualizzo il messaggio di errore al posto della lista dei giocatori
        }
        else // "OK"
        {        
            accettato = true;
        }
        return accettato;
    }

    public void getGiocatoriSuServer() //CLIENT
    {
        //mi faccio inviare dal server la lista dei giocatori
        giocatoriSulServer = new ArrayList<String>();
        System.out.println("--- DA CLIENT A SERVER ---");
        Utils.inviaStringaSuSocket("ListaGiocatori",socket, ipServer, portaServer);
        String risposta = Utils.riceviStringaDaSocket(socket);
        StringTokenizer t = new StringTokenizer(risposta,"-");
        while (t.hasMoreTokens())
        {
            giocatoriSulServer.add(t.nextToken());
        }
        System.out.println("--- DA CLIENT A GUI ---\nAGGIORNO TABELLA GIOCATORI");
        guiMenu.aggiornaTabellaGiocatori(giocatoriSulServer);
    }

    public boolean cancellaDaServer() //CLIENT
    {
        System.out.println("--- DA CLIENT A SERVER ---");
        Utils.inviaStringaSuSocket("Voglio uscire: "+nomeGiocatore,socket, ipServer, portaServer);
        String risposta = Utils.riceviStringaDaSocket(socket);
        if (risposta.equals("Eliminato con successo"))
        {
            return true;
        }
        else // risposta.equals("Nome non presente in lista")
        {
            return false;
        }
    }

    public void iniziaPartita() //puo' essere chiamato solo dal localhost
    {
        System.out.println("--- DA CLIENT A SERVER ---");
        Utils.inviaStringaSuSocket("iniziaPartita", socket, "127.0.0.1", portaServer);
    }

    public void annullaPartita() //puo' essere chiamato solo dal localhost
    {
        System.out.println("--- DA CLIENT A SERVER ---");
        Utils.inviaStringaSuSocket("annullaPartita", socket, "127.0.0.1", portaServer);
    }

    @Override
    public void run()
    {
        System.out.println("thread client avviato");

        boolean partitaIniziata = false;
        while (partitaIniziata == false)
        {
            String[] info = Utils.riceviStringaConInfoDaSocket(getSocket());           
            String messaggio = info[0];
            String ipMittente = info[1];
            int portaMittente = Integer.parseInt(info[2]);
            if (messaggio.startsWith("GUI: ")) //messaggio proveniente dalla GUI
            {
                 StringTokenizer t = new StringTokenizer(messaggio,":");
                 t.nextToken(); //butto via la stringa "GUI"
                 String richiesta = t.nextToken().trim();
                 if (richiesta.equals("cancellaDalServer"))
                 {
                     cancellaDaServer();
                     //da gestire la risposta ---  DA FARE (NON URGENTE) ---
                 }
                 if (richiesta.equals("iniziaPartita"))
                 {
                     iniziaPartita();
                 }
                 if (richiesta.equals("annullaPartita")) 
                 {
                     annullaPartita();
                 }
                 if (richiesta.equals("uniscitiAllaPartitaSulServer"))
                 {
                     uniscitiAllaPartitaSulServer();
                 }
                 if (richiesta.equals("aggiornaGiocatori"))
                 {
                     getGiocatoriSuServer();
                 }
            }
            else //messaggio proveniente dal server
            {
                if (messaggio.equals("Partita annullata"))
                {
                    //chiamo metodi della GUI per azzerare tutto
                }
                if (messaggio.equals("Inizia la partita"))
                {
                    partitaIniziata = true;
                    //dico alla GUI di passare al tavolo da gioco
                }
                if (messaggio.equals("OK"))
                {
                    //aggiorno la GUI ----------------------------------------------------- DA FARE ------------------------
                }
            }
        }
        
    }

}
